package com.example.origin.demo.suanfa;

import java.util.LinkedHashMap;
import java.util.Map;  
  
public class LRUCache<K, V> extends LinkedHashMap<K, V> {  
    private int capacity;  
  
    public LRUCache(int capacity) {  
        // true 表示让 LinkedHashMap 按照访问顺序来进行排序，最近访问的放在头部，最老访问的放在尾部。  
        super(capacity, 0.75f, true);  
        this.capacity = capacity;  
    }  
  
    @Override  
    protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {  
        // 当 map 中的数据量大于指定的缓存个数的时候，就自动删除最老的数据。  
        return size() > capacity;  
    }  
  
    public static void main(String[] args) {  
        LRUCache<Integer, String> cache = new LRUCache<>(3);  
        cache.put(1, "one");  
        cache.put(2, "two");  
        cache.put(3, "three");  
        System.out.println(cache);  // 输出：{1=one, 2=two, 3=three}  
        cache.get(1);  
        cache.get(1);
        cache.get(1);
        cache.get(2);
        cache.get(3);
        System.out.println(cache);
        // 输出：{2=two, 3=three, 1=one}，因为最近访问了1，所以1被移到了最前面
        cache.put(4, "four");  
        System.out.println(cache);  // 输出：{3=three, 1=one, 4=four}，因为缓存容量为3，所以最久未使用的2被移除了  
    }  
}